define(function(require, exports, module) {
	var $ = require('bigfoot/common');

	// 分页对象
    var pageHelper = {
    	pageSize : 10,         // 每页显示多少笔记录
    	pageNo : 1,            // 第 几 页，不是从 0 开始
    	totolCount : 0,        // 总记录数
    	pages : 0,             // 总页数
    	isBOF : true,          // 是否到头了？
    	isEOF : false,         // 是否到尾了？
    	itemStart : 0,         // 查询起始数，即 数据库中 记录的 行数，第 N 行
	    isByPageNo : true,     // 是否按照第 N 页来分页，否则的话是 offset 方式分页
	    byPageNo_Key : 'page', // 第 N 页参数的 key 是什么？
    	pageSize_Key : 'limit',// pageSize 参数的 key 是什么？
    	nextPage : function(){
    		if(this.itemStart >= this.totalCount || this.pageNo >= this.pages){          // 已到最后一页了
    			this.isEOF = true; 
    			return false;
    		}

            this.itemStart = this.pageNo * this.pageSize;   // 当前页数 * 每页记录数 = 起始记录次序
     
    		return ++this.pageNo;                           // 下一页
    	},
    	prevPage : function(){
    		if(this.itemStart <= 0){
    			this.isBOF = true; // 已到最前一页了
    			return false;
    		}
    		
            this.pageNo--;
			// 页码从1开始算而不是0，所以要修正 itemStart
            this.itemStart = (this.pageNo == 1 ? 0 : this.pageNo - 1) * this.pageSize;

    		return this.pageNo;
    	},
    	setPageParams : function(params){
			var requestParams = Object.create(params);
// debugger
		    if(this.isByPageNo){// 按照第 N 页来分页
		    	requestParams[this.ui['byPageNo_Key']] = this.pageNo;
		    	requestParams[this.ui['pageSize_Key']] = this.pageSize;
		    }else{
		    	requestParams['start'] = this.itemStart;
		    	requestParams['limit'] = this.pageSize;
		    }

			return requestParams;
    	},

    	// 计算总页数 @return {Number}
    	getTotalPages : function(){
            var totalPages = this.totalCount % this.pageSize == 0 ? this.totalCount / this.pageSize : parseInt(this.totalCount / this.pageSize) + 1;
            return totalPages;
    	},

        /**
         * [ description]@dep
         * @param  {Number} totalCount 上次查询所返回的记录数
         * @return {[type]}           [description]
         */
    	setTotalCount : function(totalCount){
            this.totalCount = totalCount;
            this.pages = this.getTotalPages();
    	},

        resetPage : function(){
            var _default = {
                totolCount : 0,
                //当前显示的记录数
                itemStart: 0,
                // 总页数
                pages : 0,
                isBOF : true,
                isEOF : false,
                itemStart : 0
            }

            for(var i in _default)this[i] = _default[i];
        }
    }

    // @dep?
	
	function appenRender(r, _tpl, contentList){
		var cfg = this, eachItem = cfg.eachItem;
		var data = r.results;

		cfg._pageHelper.totolCount = r.totolCount; // 设置总数
		cfg._pageHelper.afterTotalCountFn(data.length);

		for(var entry, i = 0, j = data.length; i < j; i++){
			entry = data[i];
			eachItem && cfg.eachItem(entry, service);

			// 创建元素
	    	var li = document.createElement('li');
	    	li.innerHTML = tpl.replace(_tpl, entry);
	    	contentList.appendChild(li);
		}
	}
    var list = {
	    params : {},
	    pageSize : 10,
	    itemTpl :  '<ul>\
						<tpl>\
							<li><a href="?uid={uid}">{title}</a></li>\
						</tpl>\
					</ul>',
        // 发起请求
	    request : function(isJSONP /* @todo */ ){
            if(this.baseParam){
                for(var i in this.baseParam)
                    this.params[i] = this.baseParam[i];
            }
            if(this.isPost)$.post(this.url, render.bind(this), this._pageHelper.setPageParams(this.params));
            else $.get(this.url, render.bind(this), this._pageHelper.setPageParams(this.params));
	    },

    	init : function(){
			if(!this.url)throw '未指定 url 参数！服务端地址是神马？';
		    if(!this.listContainer)throw '未指定 ui 控件元素，通常这是一个 div，里面有 ul element';
	
	    	if (this.pager && this.pager.pageIndicator)
                this.pageIndicatorTpl = this.pager.pageIndicator.innerHTML;

// debugger;
	    	// 委托分页记录对象
    		this._pageHelper = Object.create(pageHelper);
            this._pageHelper.ui = this;
            this._pageHelper.pageSize = this.pageSize;
			this._pageHelper.isByPageNo = this.isByPageNo;
			
//			var tbody = document.querySelector('tbody');
//			tbody.style.minHeight = "100px";
//			tbody.innerHTML = '';

			this.request();

			this.pager && this.pager.prevBtn && this.pager.prevBtn.onClk(function(){
                //this.params = url2json(window.location.hash);
				this._pageHelper.prevPage() && this.request();
			}.bind(this));

			this.pager && this.pager.nextBtn && this.pager.nextBtn.onClk(function(){
                //this.params = url2json(window.location.hash);
				this._pageHelper.nextPage() && this.request();
			}.bind(this));
    	},
        setTotalCount : function(totalCount){
            var dataNotFound = this.dataNotFound && this.dataNotFound.style;
            this._pageHelper.setTotalCount(totalCount);

            var pager = this.pager;
            if(!pager)return;

            if(totalCount <= 0){ // 没有记录，隐藏分页按钮，并显示没有记录！
               
                pager.hideState = true;
                pager.prevBtn.style.display = pager.pageIndicator.style.display = pager.nextBtn.style.display = 'none';
                
                if (dataNotFound)dataNotFound.display = "block";
            }else{
                if(pager.hideState){
                    pager.prevBtn.style.display = pager.pageIndicator.style.display = pager.nextBtn.style.display = '';
                    pager.hideState = false;
                }
                if (dataNotFound)dataNotFound.display = 'none';
            }

            // 如果查询得到的记录数小于页面记录数的话，那当然没必要分页了在这一页已经可以完全宣示了
        },
        resetPage : function(){
            this._pageHelper.resetPage();
        }

    };

    // 得到数据选，读取模板渲染数据
    function render(json){
        if(this.onload){
            json = this.onload(json);
            if(json == false)return;
        }
        // debugger;
        this.setTotalCount(json.total);
        
        if(json.total && !json.result){
        	throw '接口返回的不是 result 哦';
        }
        
        $.databinding_List(this.itemTpl, json.result, this.listContainer || 'listContainer');
       
        if(json.total && this.pager)renderIndicator.call(this);
        this.afterRender && this.afterRender();
    }

    // update indicator
    function renderIndicator(){
        var pageIndicator = this.pager.pageIndicator;

        if(this.pageIndicatorTpl){
            pageIndicator.innerHTML = this.pageIndicatorTpl.format(this._pageHelper);   // 填充内容
            if(pageIndicator.style.display.indexOf('none') != -1){                       // 显示！
                pageIndicator.style.display = 'inline';
            }
        }
    }
    exports.list = list;

    // 自动生成 id
    function everyItem(item, index) {
    	var $$_id = '$$_id_' + (++arguments.callee.idSeed);
    	item.$$_id = $$_id;
    }

    everyItem.idSeed = 0;
    /**
     *
     * @param  {String} ids [description]
     * @return {Object}     [description]
     */
    function url2json(ids) {
        var _json = {};
        if (ids && ids.indexOf("#") != -1) {

            ids = ids.split('#');
            ids = ids.pop();
            ids = ids.replace(/&/g, '","').replace(/=/g, '":"');
            if (ids) {
                _json = JSON.parse('{"' + ids + '"}');
            }
            // var ids = ids.split('&');
            // var json = {};
            // for(var arr, i = 0, j = ids.length; i < j; i++){
            //  arr = ids[i];
            //  arr = arr.split('=');
            //  json[arr[0]] = arr[1];
            // }
        }
        return _json;
    }
});